اكتشف عالم الأنظمة المدمجة مع بايثون. يغطي هذا الدليل الشامل MicroPython وCircuitPython وتكامل الأجهزة ومشاريع واقعية لجمهور عالمي.
بايثون على المعدن: غوص عميق في البرمجة المدمجة وتكامل المتحكمات الدقيقة
لعقود من الزمن، كان عالم الأنظمة المدمجة - وهي أجهزة الكمبيوتر الصغيرة التي تشغل كل شيء من الساعات الذكية إلى الآلات الصناعية - حكراً على لغات المستوى المنخفض مثل C وC++ وAssembly. تقدم هذه اللغات تحكماً وأداءً لا مثيل لهما، لكنها تأتي مع منحنى تعليمي حاد ودورات تطوير طويلة. يدخل بايثون، اللغة المشهورة ببساطتها وقابليتها للقراءة ونظامها البيئي الواسع. بعد أن كانت مقصورة على خوادم الويب وعلوم البيانات، أصبحت بايثون الآن تدفع بقوة نحو قلب الأجهزة، مما يضفي طابعاً ديمقراطياً على الإلكترونيات لجيل جديد من المطورين والهواة والمبتكرين في جميع أنحاء العالم.
هذا الدليل هو مقدمتك الشاملة إلى العالم المثير لبرمجة بايثون المدمجة. سوف نستكشف كيف يمكن للغة عالية المستوى مثل بايثون التحكم في الأجهزة مباشرة، ونتفحص المنصات الرئيسية التي تجعل ذلك ممكناً، ونسير في أمثلة عملية لتبدأ رحلتك من البرمجيات إلى السيليكون.
النظام البيئي المدمج لبايثون: أكثر من مجرد CPython
لا يمكنك ببساطة تثبيت بايثون القياسي الذي تستخدمه على جهاز الكمبيوتر المحمول (المعروف باسم CPython) على متحكم دقيق نموذجي. تتمتع هذه الأجهزة بموارد محدودة للغاية - نتحدث عن كيلوبايت من ذاكرة الوصول العشوائي وميغاهرتز من قوة المعالجة، وهو تناقض صارخ مع الغيغابايت والغيغاهرتز في الكمبيوتر الحديث. لسد هذه الفجوة، تم إنشاء تطبيقات متخصصة ومبسطة لبايثون.
MicroPython: بايثون للمتحكمات الدقيقة
MicroPython هي إعادة كتابة كاملة للغة بايثون 3، محسّنة للتشغيل على الأجهزة محدودة الموارد. تم إنشاؤها بواسطة داميان جورج، وتهدف إلى أن تكون متوافقة قدر الإمكان مع بايثون القياسي مع توفير وصول مباشر ومنخفض المستوى إلى الأجهزة.
- الميزات الرئيسية: تتضمن حلقة قراءة وتقييم وطباعة تفاعلية (REPL)، مما يتيح لك الاتصال باللوحة وتنفيذ الكود سطراً بسطر دون الحاجة لخطوة تجميع. إنها ذات كفاءة عالية، وبصمة ذاكرة صغيرة، وتوفر وحدات قوية مثل
machineللتحكم المباشر في الأجهزة (GPIO, I2C, SPI, إلخ.). - الأفضل لـ: المطورين الذين يرغبون في أقصى أداء، وتحكم دقيق في الأجهزة، والتوافق عبر مجموعة واسعة من المتحكمات الدقيقة. إنها أقرب إلى "المعدن" وغالباً ما تُفضل للتطبيقات التي تتطلب أداءً حاسماً.
CircuitPython: القوة الصديقة للمبتدئين
CircuitPython هي فرع من MicroPython أنشأتها وتديرها Adafruit، وهي شركة رائدة في مجال الإلكترونيات التي تصنعها بنفسك (DIY). بينما تشترك في جوهرها مع MicroPython، فإن فلسفتها تركز على سهولة الاستخدام والتعليم.
- الميزات الرئيسية: الميزة الأبرز هي طريقة تقديم المتحكم الدقيق لجهاز الكمبيوتر الخاص بك. عندما تقوم بتوصيل لوحة CircuitPython، تظهر كقرص USB صغير. ما عليك سوى تحرير ملف
code.pyالخاص بك على هذا القرص وحفظه؛ تقوم اللوحة بإعادة التحميل وتشغيل الكود الجديد تلقائياً. كما تتميز بواجهة برمجة تطبيقات موحدة عبر جميع اللوحات المدعومة، مما يعني أن الكود الخاص بقراءة مستشعر على لوحة سيعمل على لوحة أخرى مع الحد الأدنى من التغييرات. - الأفضل لـ: المبتدئين والمعلمين وأي شخص يركز على النماذج الأولية السريعة. منحنى التعلم أكثر سلاسة، والنظام البيئي الواسع للمكتبات الذي توفره Adafruit يجعل دمج المستشعرات والشاشات والمكونات الأخرى بسيطاً بشكل لا يصدق.
MicroPython مقابل CircuitPython: مقارنة سريعة
غالباً ما يعتمد الاختيار بينهما على أهداف مشروعك ومستوى خبرتك.
- الفلسفة: تعطي MicroPython الأولوية للميزات والأداء الخاص بالأجهزة. تعطي CircuitPython الأولوية للبساطة والتناسق وسهولة التعلم.
- سير العمل: مع MicroPython، تستخدم عادةً أداة مثل Thonny للاتصال بـ REPL الخاص بالجهاز وتحميل الملفات. مع CircuitPython، تقوم بسحب وإسقاط ملف
code.pyعلى محرك أقراص USB. - دعم الأجهزة: تدعم MicroPython مجموعة واسعة من اللوحات من العديد من الشركات المصنعة. تدعم CircuitPython بشكل أساسي لوحات Adafruit وشركاء مختارين من جهات خارجية، ولكن دعمها عميق وموثق جيداً.
- المكتبات: تحتوي CircuitPython على مجموعة ضخمة ومنسقة من المكتبات سهلة التثبيت. مكتبات MicroPython متاحة أيضاً ولكن يمكن أن تكون أكثر تجزؤاً.
بالنسبة لهذا الدليل، ستكون المفاهيم والعديد من أمثلة الكود قابلة للتطبيق على كليهما، مع تعديلات بسيطة. سنشير إلى الاختلافات حيثما تكون مهمة.
اختيار أجهزتك: ساحة معركة المتحكمات الدقيقة
لقد انفجر عدد المتحكمات الدقيقة (MCUs) التي يمكنها تشغيل بايثون في السنوات الأخيرة. فيما يلي بعض الخيارات الأكثر شعبية والتي يسهل الوصول إليها للجمهور العالمي.
Raspberry Pi Pico وRP2040
لا يجب الخلط بينه وبين كمبيوتر Raspberry Pi الكامل، فإن Pico هي لوحة متحكم دقيق منخفضة التكلفة وعالية الأداء مبنية حول شريحة RP2040 المخصصة. لقد أصبحت المفضلة عالمياً لبايثون على الأجهزة.
- الميزات الرئيسية: معالج ARM Cortex-M0+ قوي ثنائي النواة، وذاكرة وصول عشوائي (RAM) سخية تبلغ 264 كيلوبايت، وميزة فريدة تسمى الإدخال/الإخراج القابل للبرمجة (PIO) التي تسمح بإنشاء واجهات أجهزة مخصصة. يضيف طراز Pico W الأحدث شبكة Wi-Fi مدمجة.
- لماذا هي رائعة لبايثون: لديها دعم رسمي ومتميز لـ MicroPython وهي مدعومة جيداً أيضاً بواسطة CircuitPython. سعرها المنخفض (غالباً أقل من 10 دولارات أمريكية) وأدائها القوي يجعلانها ذات قيمة لا تصدق.
Espressif ESP32 وESP8266
صنعتها شركة Espressif Systems ومقرها شنغهاي، تعتبر عائلة شرائح ESP أبطال إنترنت الأشياء بلا منازع. تشتهر بقدراتها المدمجة على Wi-Fi والبلوتوث، مما يجعلها الخيار الافتراضي للمشاريع المتصلة.
- الميزات الرئيسية: معالجات قوية أحادية أو ثنائية النواة، وشبكة Wi-Fi مدمجة و(على ESP32) بلوتوث. وهي متوفرة على الآلاف من لوحات التطوير المختلفة من الشركات المصنعة في جميع أنحاء العالم.
- لماذا هي رائعة لبايثون: دعم ممتاز لـ MicroPython يسمح لك ببناء أجهزة متصلة ببضعة أسطر فقط من كود بايثون. قوة معالجتها أكثر من كافية للمهام المعقدة مثل تشغيل خوادم الويب أو التعامل مع البيانات من مستشعرات متعددة.
Adafruit Feather وItsyBitsy وأنظمة Trinket البيئية
تقدم Adafruit مجموعة واسعة من اللوحات بأشكال قياسية. هذه ليست شرائح محددة بل عائلات منتجات مصممة للعمل بسلاسة داخل النظام البيئي لـ CircuitPython.
- الميزات الرئيسية: تتشارك اللوحات في عائلة Feather في نفس تخطيط الأطراف، مما يجعلها قابلة للتبديل. يشتمل العديد منها على دوائر وموصلات شحن البطارية المدمجة. وهي متوفرة مع مجموعة متنوعة من المتحكمات الدقيقة، بما في ذلك RP2040 وESP32 وغيرها.
- لماذا هي رائعة لبايثون: تم تصميمها من الألف إلى الياء لـ CircuitPython. هذا التكامل المحكم يعني تجربة سلسة، قابلة للتشغيل بمجرد التوصيل، مع الوصول إلى مئات المكتبات والبرامج التعليمية.
البدء: "مرحباً أيها العالم" الأول على الأجهزة
دعنا ننتقل من النظرية إلى الممارسة. يعتبر "مرحباً أيها العالم" التقليدي للبرمجة المدمجة هو وميض ضوء LED. يؤكد هذا الإجراء البسيط أن سلسلة أدواتك بأكملها - من محرر الكود الخاص بك إلى البرامج الثابتة على اللوحة - تعمل بشكل صحيح.
المتطلبات الأساسية
- لوحة متحكم دقيق مدعومة (مثل Raspberry Pi Pico، ESP32، أو لوحة Adafruit).
- كابل USB يدعم نقل البيانات (وليس الشحن فقط).
- جهاز كمبيوتر (Windows، macOS، أو Linux).
الخطوة 1: تثبيت البرامج الثابتة
تحتاج لوحتك إلى تثبيت مترجم MicroPython أو CircuitPython عليها. يُطلق على هذا اسم "وميض البرامج الثابتة".
- بالنسبة لـ CircuitPython: قم بزيارة circuitpython.org، وابحث عن لوحتك، وقم بتنزيل ملف
.uf2. ضع لوحتك في وضع أداة تحميل التشغيل (يتضمن ذلك عادةً الضغط على زر "BOOT" أو "RESET" أثناء توصيله). ستظهر كقرص USB. اسحب ملف.uf2الذي تم تنزيله إليها. سيتم إخراج القرص ثم يظهر مرة أخرى، باسم CIRCUITPY الآن. - بالنسبة لـ MicroPython: قم بزيارة micropython.org، وابحث عن لوحتك، وقم بتنزيل ملف البرامج الثابتة (غالباً ما يكون ملف
.uf2أو.bin). العملية مشابهة: ضع اللوحة في وضع أداة تحميل التشغيل وانسخ الملف.
الخطوة 2: إعداد المحرر الخاص بك
بينما يمكنك استخدام أي محرر نصوص، فإن بيئة تطوير متكاملة (IDE) مخصصة تجعل التطوير أسهل بكثير. يوصى بشدة بـ Thonny IDE للمبتدئين. إنه مجاني، ومتعدد المنصات، ويأتي مع دعم مدمج لـ MicroPython وCircuitPython. يقوم تلقائياً باكتشاف لوحتك، ويوفر الوصول إلى REPL الخاص بالجهاز، ويسهل تحميل الملفات.
الخطوة 3: كود وميض LED
الآن للكود. أنشئ ملفاً جديداً باسم main.py لـ MicroPython أو قم بتحرير ملف code.py الموجود لـ CircuitPython.
مثال على MicroPython على Raspberry Pi Pico W:
import machine
import utime
# يتم الوصول إلى LED المدمج على Pico W عبر اسم خاص
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("تم تبديل حالة LED!")
utime.sleep(0.5) # انتظر نصف ثانية
مثال على CircuitPython على معظم لوحات Adafruit:
import board
import digitalio
import time
# عادة ما يكون LED المدمج متصلاً بطرف يسمى 'LED'
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("تم تبديل حالة LED!")
time.sleep(0.5)
شرح الكود:
import: نقوم باستيراد المكتبات للتحكم في الأجهزة (machine،digitalio،board) وإدارة الوقت (utime،time).- إعداد الطرف: نحدد الطرف الفيزيائي الذي نريد التحكم فيه (LED المدمج) ونقوم بتكوينه كمخرج.
- الحلقة: حلقة
while True:تعمل إلى الأبد. داخل الحلقة، نقوم بتبديل حالة LED (تشغيل إلى إيقاف، أو إيقاف إلى تشغيل)، ونطبع رسالة إلى وحدة التحكم التسلسلية (مرئية في Thonny)، ثم نتوقف لمدة نصف ثانية.
احفظ هذا الملف على جهازك. يجب أن يبدأ LED المدمج في الوميض فوراً. تهانينا، لقد قمت للتو بتشغيل بايثون مباشرة على متحكم دقيق!
غوص أعمق: مفاهيم أساسية لبايثون على المتحكمات الدقيقة
وميض LED هو مجرد البداية. دعنا نستكشف المفاهيم الأساسية التي ستستخدمها لبناء مشاريع أكثر تعقيداً.
مدخلات ومخرجات للأغراض العامة (GPIO)
أطراف GPIO هي الاتصالات الفيزيائية التي تسمح لمتحكمك الدقيق بالتفاعل مع العالم. يمكن تكوينها كمدخلات (لقراءة البيانات من الأزرار أو المستشعرات) أو كمخرجات (للتحكم في مصابيح LED أو المحركات أو المرحلات).
قراءة ضغطة زر (MicroPython):
import machine
import utime
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("تم الضغط على الزر!")
utime.sleep(0.1)
هنا، نقوم بتكوين الطرف 14 كمدخل مع مقاومة سحب سفلية داخلية. تتحقق الحلقة باستمرار مما إذا كانت قيمة الزر 1 (مرتفعة)، مما يشير إلى أنه قد تم الضغط عليه.
العمل مع المستشعرات
تتضمن معظم المشاريع الشيقة المستشعرات. يجعل بايثون من السهل القراءة من كل من المستشعرات التناظرية والرقمية.
- المستشعرات التناظرية: توفر هذه المستشعرات، مثل المقاومات الضوئية (لقياس الضوء) أو مقاييس الجهد، جهداً متغيراً. يقرأ محول تناظري رقمي (ADC) في المتحكم الدقيق هذا الجهد ويحوله إلى رقم.
- المستشعرات الرقمية: تتواصل هذه المستشعرات الأكثر تقدماً (مثل مستشعرات درجة الحرارة/الرطوبة، ومقاييس التسارع) باستخدام بروتوكولات محددة. الأكثر شيوعاً هما I2C (الدائرة المتكاملة البينية) وSPI (واجهة الأجهزة التسلسلية). تسمح هذه البروتوكولات لأجهزة متعددة بالتواصل مع المتحكم الدقيق باستخدام عدد قليل من الأطراف. لحسن الحظ، نادراً ما تحتاج إلى معرفة التفاصيل منخفضة المستوى، حيث تتعامل المكتبات مع الاتصال نيابة عنك.
قراءة درجة الحرارة باستخدام مستشعر BMP280 (CircuitPython):
import board
import adafruit_bmp280
# إنشاء كائن ناقل I2C
i2c = board.I2C() # يستخدم أطراف SCL و SDA الافتراضية
# إنشاء كائن مستشعر
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# قراءة درجة الحرارة
temperature = bmp280.temperature
print(f"درجة الحرارة: {temperature:.2f} مئوية")
تعديل عرض النبضة (PWM)
PWM هي تقنية تستخدم لمحاكاة إخراج تناظري على طرف رقمي. عن طريق تبديل الطرف بسرعة بين التشغيل والإيقاف، يمكنك التحكم في متوسط الجهد، وهو أمر مفيد لتعتيم مصباح LED، أو التحكم في سرعة محرك DC، أو وضع محرك سيرفو.
الاتصال وإنترنت الأشياء (IoT)
هنا تبرز لوحات مثل ESP32 وPico W حقاً. مع شبكة Wi-Fi المدمجة، يجعل بايثون من السهل بشكل مذهل بناء أجهزة إنترنت الأشياء.
الاتصال بشبكة Wi-Fi
توصيل جهازك بشبكة هو الخطوة الأولى. ستحتاج إلى إنشاء ملف (غالباً ما يسمى secrets.py في CircuitPython) لتخزين بيانات اعتماد شبكتك بشكل آمن.
توصيل ESP32 بشبكة Wi-Fi (MicroPython):
import network
SSID = "اسم شبكتك"
PASSWORD = "كلمة مرور شبكتك"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("تم الاتصال بنجاح")
print(station.ifconfig())
إجراء طلبات الويب
بمجرد الاتصال، يمكنك التفاعل مع الإنترنت. يمكنك جلب البيانات من واجهات برمجة التطبيقات (APIs)، أو نشر بيانات المستشعر على خدمة ويب، أو تشغيل إجراءات عبر الإنترنت.
جلب بيانات JSON من واجهة برمجة تطبيقات (باستخدام مكتبة `urequests`):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"الوقت العالمي المنسق الحالي هو: {data['datetime']}")
response.close()
MQTT: لغة إنترنت الأشياء
بينما HTTP مفيد، فإن المعيار الذهبي للاتصال في إنترنت الأشياء هو MQTT (نقل القياس عن بعد بالرسائل المتسلسلة). إنه بروتوكول خفيف الوزن من نوع النشر-الاشتراك مصمم للشبكات ذات النطاق الترددي المنخفض والكمون العالي. يمكن للجهاز "نشر" بيانات المستشعر إلى "موضوع"، وأي جهاز آخر (أو خادم) "مشترك" في هذا الموضوع سيتلقى البيانات على الفور. هذا أكثر كفاءة بكثير من الاستعلام المستمر عن خادم ويب.
مواضيع متقدمة وأفضل الممارسات
مع نمو مشاريعك، ستواجه قيود المتحكم الدقيق. فيما يلي بعض أفضل الممارسات لكتابة كود بايثون مدمج قوي.
- إدارة الذاكرة: ذاكرة الوصول العشوائي (RAM) هي أثمن مواردك. تجنب إنشاء كائنات كبيرة مثل القوائم أو السلاسل الطويلة داخل الحلقات. استخدم وحدة
gc(import gc; gc.collect()) لتشغيل جمع البيانات المهملة يدوياً وتحرير الذاكرة. - إدارة الطاقة: بالنسبة للأجهزة التي تعمل بالبطارية، تعد كفاءة الطاقة أمراً بالغ الأهمية. تحتوي معظم المتحكمات الدقيقة على وضع "النوم العميق" الذي يغلق معظم الشريحة، ويستهلك القليل جداً من الطاقة، ويمكنه الاستيقاظ بعد وقت محدد أو من محفز خارجي.
- نظام الملفات: يمكنك قراءة الملفات وكتابتها إلى ذاكرة الفلاش المدمجة، تماماً كما هو الحال في جهاز كمبيوتر عادي. هذا مثالي لتسجيل البيانات أو تخزين إعدادات التكوين.
- المقاطعات: بدلاً من التحقق باستمرار من حالة الزر في حلقة (عملية تسمى الاستقصاء)، يمكنك استخدام مقاطعة. طلب المقاطعة (IRQ) هو إشارة جهاز توقف الكود الرئيسي لتشغيل وظيفة خاصة، ثم تستأنف. هذا أكثر كفاءة واستجابة بكثير.
عرض أفكار مشاريع واقعية
هل أنت مستعد للبناء؟ إليك بعض الأفكار التي تجمع بين المفاهيم التي ناقشناها:
- محطة طقس ذكية: استخدم ESP32 مع مستشعر BME280 لقياس درجة الحرارة والرطوبة والضغط. اعرض البيانات على شاشة OLED صغيرة وانشرها عبر MQTT إلى لوحة تحكم مثل Adafruit IO أو Home Assistant.
- نظام ري نباتات أوتوماتيكي: قم بتوصيل مستشعر رطوبة التربة بـ Raspberry Pi Pico. عندما تكون التربة جافة، استخدم طرف GPIO لتنشيط مرحل يقوم بتشغيل مضخة مياه صغيرة لبضع ثوانٍ.
- لوحة ماكرو USB مخصصة: استخدم لوحة CircuitPython تدعم USB HID (جهاز واجهة بشرية)، مثل Pico أو العديد من لوحات Adafruit. برمج الأزرار لإرسال اختصارات لوحة مفاتيح معقدة أو طباعة نص محدد مسبقاً، مما يعزز إنتاجيتك.
الخلاصة: المستقبل مدمج في بايثون
لقد غيرت بايثون بشكل جذري مشهد التطوير المدمج. لقد خفضت حاجز الدخول، مما مكّن مطوري البرمجيات من التحكم في الأجهزة ومهندسي الأجهزة من بناء نماذج أولية بشكل أسرع من أي وقت مضى. بساطة قراءة مستشعر أو الاتصال بالإنترنت في بضعة أسطر فقط من الكود القابل للقراءة هي تغيير جذري.
الرحلة من وميض LED إلى جهاز إنترنت الأشياء متكامل الميزات هي رحلة مجزية بشكل لا يصدق. المجتمع العالمي وثروة المكتبات مفتوحة المصدر يعني أنك لست وحيداً أبداً عندما تواجه تحدياً. لذا اختر لوحة، وقم بتحميل البرامج الثابتة، وابدأ مغامرتك في التقاطع المثير بين بايثون والعالم المادي. الحد الوحيد هو خيالك.